package pe.gob.osinergmin.activity.module;

import android.content.Context;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TableLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.melnykov.fab.FloatingActionButton;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import pe.gob.osinergmin.R;
import pe.gob.osinergmin.activity.dialog.RegisterItemDialog;
import pe.gob.osinergmin.activity.generic.GenericBackActionBarActivity;
import pe.gob.osinergmin.bean.SupervisionMovil;
import pe.gob.osinergmin.bean.SupervisionMovilDetalleSCOP;
import pe.gob.osinergmin.bean.common.Producto;
import pe.gob.osinergmin.bean.common.Usuario;
import pe.gob.osinergmin.utils.PuntoControlConstants;
import pe.gob.osinergmin.utils.PuntoControlDetalleScopControl;
import pe.gob.osinergmin.utils.PuntoControlUtils;

import static pe.gob.osinergmin.utils.PuntoControlConstants.SESSION_USER_VAR;

public class ScopActivity extends GenericBackActionBarActivity {

    public int _toolbar = R.id.scop_toolbar;

    public static int code = 0;

    private TableLayout tblDetalle;

    private Usuario usuario;

    private EditText txtSupervisionScopObservacion;

    private Spinner cmbTipoTramo;

    private List<SupervisionMovilDetalleSCOP> supervisionMovilDetalleSCOPList;

    private SupervisionMovil supervisionMovil;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.module_scop);
        setToolbar((Toolbar) findViewById(_toolbar));
        setSupportActionBar(getToolbar());
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        if(PuntoControlUtils.getProgressDialog().isShowing()){
            PuntoControlUtils.getProgressDialog().dismiss();
        }
        usuario = (Usuario)getIntent().getExtras().getSerializable(SESSION_USER_VAR);

        writeStatusBar();

        LinearLayout btnRegresar = (LinearLayout)getToolbar().findViewById(R.id.btnRegresar);
        btnRegresar.setOnClickListener(this);

        ImageView btnSave = (ImageView)getToolbar().findViewById(R.id.btnSave);
        btnSave.setOnClickListener(this);

        FloatingActionButton floatingActionButton = (FloatingActionButton) findViewById(R.id.btnAddRegister);
        floatingActionButton.setOnClickListener(this);

        // Se generan los punteros a las tablas para poder buscar los elementos dentro de las mismas
        TableLayout tblUnidadOperativa = (TableLayout) findViewById(R.id.tblUnidadOperativa);
        tblDetalle = (TableLayout) findViewById(R.id.tblDetalle);

        // Se obtienen los labels de las tablas
        // Tabla Unidad Operativa
        TextView lblRazonSocial = (TextView) tblUnidadOperativa.findViewById(R.id.lblRazonSocial);
        TextView lblRegistroHidrocarburos = (TextView) tblUnidadOperativa.findViewById(R.id.lblRegistroHidrocarburos);
        TextView lblRUC = (TextView) tblUnidadOperativa.findViewById(R.id.lblRUC);
        TextView lblTipo = (TextView) tblUnidadOperativa.findViewById(R.id.lblTipo);
        TextView lblCapacidad = (TextView) tblUnidadOperativa.findViewById(R.id.lblCapacidad);

        // Se llenan los datos de la unidad operativa
        lblRazonSocial.setText(PuntoControlConstants.unidadOperativa.getRazonSocial());
        lblRegistroHidrocarburos.setText(PuntoControlConstants.unidadOperativa.getRegistroHidrocarburos());
        lblRUC.setText(PuntoControlConstants.unidadOperativa.getRuc());
        lblTipo.setText(PuntoControlConstants.unidadOperativa.getTipo());
        lblCapacidad.setText(String.valueOf(PuntoControlConstants.unidadOperativa.getCapacidad()));

        txtSupervisionScopObservacion = (EditText) findViewById(R.id.txtSupervisionScopObservacion);

        // Se realiza la busqueda de la última supervisión no sincronizada de la placa
        SupervisionMovil _supervisionMovil = new SupervisionMovil();
        _supervisionMovil.setPlaca(PuntoControlConstants.unidadOperativa.getPlaca());
        _supervisionMovil.setTipo(PuntoControlConstants.tipoSupervision.SCOP);
        _supervisionMovil.setEstado(PuntoControlConstants.estadoSupervision.REGISTRADA);

        try {
            supervisionMovil = getSupervisionMovilService().findSupervisionMovil(this, _supervisionMovil);
        } catch (Exception e) {
            e.printStackTrace();
        }

        cmbTipoTramo = (Spinner) findViewById(R.id.cmbTipoTramo);

        ArrayAdapter<String> arrayAdapterAutorizacion = new ArrayAdapter<>(this, R.layout.item_spinner, PuntoControlConstants.tipoTramo.stringList);
        arrayAdapterAutorizacion.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        cmbTipoTramo.setAdapter(arrayAdapterAutorizacion);

        if(supervisionMovil == null){
            // Si existe una supervision se genera una nueva
            createNewSupervisionMovil();
        }else{
            // Se obtienen los datos de la supervision anterior
            supervisionMovilDetalleSCOPList = null;

            supervisionMovil.setFechaRegistro(new Date());

            actualizarDetalle(supervisionMovilDetalleSCOPList, supervisionMovil);
        }
        txtSupervisionScopObservacion.setText(supervisionMovil.getObservacion());

        cmbTipoTramo.setSelection(supervisionMovil.getTramo());

        cmbTipoTramo.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                if(supervisionMovilDetalleSCOPList != null) {
                    for(int i = supervisionMovilDetalleSCOPList.size(); i > 0; i--){
                        deleteTableRow(i - 1);
                    }
                }

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
    }

    /**
     *
     * Method to create new object <code>SupervisionMovil</code>
     *
     */
    private void createNewSupervisionMovil() {
        // Si no se encuentra registrada ninguna supervision de tipo SCOP en el dispositivo para la placa
        supervisionMovil = new SupervisionMovil();
        supervisionMovil.setPlaca(PuntoControlConstants.unidadOperativa.getPlaca());
        supervisionMovil.setFechaRegistro(new Date());

        supervisionMovil.setTipo(PuntoControlConstants.tipoSupervision.SCOP);
        supervisionMovil.setLatitud(getPuntoControlGPSTracker().getLatitude());
        supervisionMovil.setLongitud(getPuntoControlGPSTracker().getLongitude());

        supervisionMovil.setCodigoOsinergmin(PuntoControlConstants.unidadOperativa.getCodigoOsinergmin());
        supervisionMovil.setRazonSocial(PuntoControlConstants.unidadOperativa.getRazonSocial());
        supervisionMovil.setRuc(PuntoControlConstants.unidadOperativa.getRuc());

        supervisionMovil.setTramo(PuntoControlConstants.tipoTramo.NO_APLICA);
        supervisionMovil.setUsuario(usuario.getUsername());
        supervisionMovil.setEstado(PuntoControlConstants.estadoSupervision.REGISTRADA);

        supervisionMovilDetalleSCOPList = new ArrayList<>();
    }

    /**
     *
     * Method to update register date for supervision detail
     *
     * @param supervisionMovilDetalleSCOPList SupervisionMovilDetalleSCOP List
     * @param supervisionMovil Object SupervisionMovil
     */
    private void actualizarDetalle(List<SupervisionMovilDetalleSCOP> supervisionMovilDetalleSCOPList, SupervisionMovil supervisionMovil) {
        if(supervisionMovilDetalleSCOPList != null && supervisionMovilDetalleSCOPList.size() > 0){
            for(SupervisionMovilDetalleSCOP supervisionMovilDetalleSCOP : supervisionMovilDetalleSCOPList){
                supervisionMovilDetalleSCOP.setFechaRegistro(supervisionMovil.getFechaRegistro());
            }
        }
    }

    private View tmpView;
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        MenuInflater inflater = new MenuInflater(this);
        inflater.inflate(R.menu.context_menu_scop, menu);
        tmpView = v;
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        int index = findIndexFromTable(tblDetalle, tmpView);
        switch (item.getItemId()) {
            case R.id.row_edit:
                onPause();
                createRegisterDialog(tblDetalle.getContext(), index);
                return true;
            case R.id.row_delete:
                deleteTableRow(index);
                return true;
            default:
                return super.onContextItemSelected(item);
        }
    }

    /**
     * Method to delete selected row from table
     *
     * @param index table row index to delete
     */
    private void deleteTableRow(int index){
        supervisionMovilDetalleSCOPList.remove(index);
        removeTableRow(index);
    }

    private void removeTableRow(int index){
        tblDetalle.removeViewAt(index + 2);
        showToast(getBaseContext(),R.string.scop_message_delete_sucessfully,Toast.LENGTH_SHORT);
    }

    @Override
    public void onClick(View v) {
        if(v.getId() == R.id.btnRegresar){
            this.finish();
        }
        if(v.getId() == R.id.btnAddRegister){
            temporalSaveInformation();
            createRegisterDialog(this, -1);
        }
        if(v.getId() == R.id.btnSave){
            try {
                supervisionMovil.setTramo(cmbTipoTramo.getSelectedItemPosition());
                supervisionMovil.setObservacion(txtSupervisionScopObservacion.getText().toString());
                getSupervisionMovilService().saveSupervisionMovilToLocal(this, supervisionMovil);
                getSupervisionMovilDetalleScopService().saveSupervisionMovilDetalleSCOPListToLocal(this, supervisionMovilDetalleSCOPList);
                showToast(this, R.string.scop_message_save_sucessfully, Toast.LENGTH_SHORT);
                temporalSaveInformation(true);
                this.finish();
            }catch(Exception e){
                showToast(this, R.string.scop_message_save_error, Toast.LENGTH_SHORT);
            }
        }
    }

    /**
     *
     * Method to show dialog
     *
     * @param context context used to create the dialog
     * @param index index to update or -1 for new item
     */
    private void createRegisterDialog(Context context, int index){
        supervisionMovil.setTramo(cmbTipoTramo.getSelectedItemPosition());
        supervisionMovil.setObservacion(txtSupervisionScopObservacion.getText().toString());
        RegisterItemDialog registerItemDialog = new RegisterItemDialog(context);
        registerItemDialog.setCancelable(false);
        registerItemDialog.setIndex(index);
        registerItemDialog.setTable(tblDetalle);
        registerItemDialog.setSupervisionMovil(supervisionMovil);
        registerItemDialog.setActivity(this);
        registerItemDialog.setSupervisionMovilDetalleSCOPList(supervisionMovilDetalleSCOPList);
        registerItemDialog.show();
    }

    /**
     *
     * Method to write information on status bar
     *
     */
    private void writeStatusBar(){
        // Colocando la bienvenida
        TableLayout tableLayout = (TableLayout) findViewById(R.id.scop_status_bar);
        TextView nombre = (TextView) tableLayout.findViewById(R.id.status_bar_nombre);
        String txtNombre = MessageFormat.format(getResources().getString(R.string.menu_welcome), usuario.getNombreCompleto());
        nombre.setText(txtNombre);

        TextView placa = (TextView)tableLayout.findViewById(R.id.status_bar_placa);
        if(PuntoControlConstants.unidadOperativa != null && (!PuntoControlConstants.EMPTY.equals(PuntoControlConstants.unidadOperativa.getPlaca()) && PuntoControlConstants.unidadOperativa.getPlaca() != null)){
            String txtPlaca = MessageFormat.format(getResources().getString(R.string.menu_placa), PuntoControlConstants.unidadOperativa.getPlaca());
            placa.setText(txtPlaca);
        }else{
            placa.setText(PuntoControlConstants.EMPTY);
        }
    }

    /**
     *
     * Method to find view index in <code>TableLayout</code>
     *
     * @param table table where find the row
     * @param v row to find
     * @return index or -1 if not found
     */
    private int findIndexFromTable(TableLayout table, View v) {
        int index = - 1;
        for(int i = 0; i < table.getChildCount(); i++){
            if(table.getChildAt(i).equals(v)){
                index = i - 2;
                break;
            }
        }
        return index;
    }

    private void temporalSaveInformation(){
        temporalSaveInformation(true);
    }

    private void temporalSaveInformation(boolean delete){
        PuntoControlDetalleScopControl puntoControlDetalleScopControl = new PuntoControlDetalleScopControl(this);
        if(!delete){
            puntoControlDetalleScopControl.saveDetalleScopList(supervisionMovil, supervisionMovilDetalleSCOPList);
        }else{
            puntoControlDetalleScopControl.clear();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        temporalSaveInformation();
    }

    @Override
    protected void onResume() {
        super.onResume();
        PuntoControlDetalleScopControl puntoControlDetalleScopControl = new PuntoControlDetalleScopControl(this);
        SupervisionMovil _supervisionMovil = puntoControlDetalleScopControl.getSupervisionMovil();
        if(_supervisionMovil != null && PuntoControlConstants.unidadOperativa.getPlaca().equals(_supervisionMovil.getPlaca())){
            supervisionMovil = _supervisionMovil;
            supervisionMovil.setObservacion(txtSupervisionScopObservacion.getText().toString());
            supervisionMovil.setTramo(cmbTipoTramo.getSelectedItemPosition());
            supervisionMovilDetalleSCOPList = puntoControlDetalleScopControl.getDetalleScopList();
            if(supervisionMovilDetalleSCOPList != null && supervisionMovilDetalleSCOPList.size() > 0){
                List<Producto> productoList = null;
                try {
                    productoList = getProductoService().getProductoList(getBaseContext());
                }catch(Exception e){
                    e.printStackTrace();
                }
                for(SupervisionMovilDetalleSCOP supervisionMovilDetalleSCOP : supervisionMovilDetalleSCOPList) {
                    PuntoControlUtils.createNewRowTableDetalleSCOP(tblDetalle, supervisionMovilDetalleSCOP, productoList, this);
                }
            }
        }else{
            if(supervisionMovil != null) {
                createNewSupervisionMovil();
            }
        }
    }
}
